#include <cstdio>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
#include <iostream>
using namespace std;
const int N=1e6+50;
map<string,int> mp;
vector<int> edge[N],que[N],num[N];
string nam[N];
bool vis[N];
int in[N],p[N],ans[N];
string s1,s2;
int n,cnt;
int find(int x){
    return p[x]==x?x:p[x]=find(p[x]);
}
void dfs(int u){
    p[u]=u;
    for(int i=0;i<edge[u].size();i++){
        dfs(edge[u][i]);
        p[edge[u][i]]=u;
    }
    vis[u]=1;
    for(int i=0;i<que[u].size();i++){
        if(vis[que[u][i]]){
            ans[num[u][i]]=find(que[u][i]);
        }
    }
}
int main(void){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        //父亲 儿子
        cin >> s1 >> s2;
        //建立双向映射
        if(!mp[s1]){
            mp[s1]=++cnt;
            nam[cnt]=s1;
        }
        if(!mp[s2]){
            mp[s2]=++cnt;
            nam[cnt]=s2;
        }
        int id1=mp[s1],id2=mp[s2];
        //记录入度
        in[id2]++;
        //父节点指向子节点
        edge[id1].push_back(id2);
    }
    //读入所有查询再离线输出
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        cin >> s1 >> s2;
        int id1=mp[s1],id2=mp[s2];  
        que[id1].push_back(id2);
        que[id2].push_back(id1);
        num[id1].push_back(i);
        num[id2].push_back(i);
    }
    for(int i=1;i<=cnt;i++){
        //入度为0即为根节点
        if(in[i]==0){
            dfs(i);
        }
    }
    for(int i=0;i<n;i++){
        cout << nam[ans[i]] << endl;
    }
    return 0;
}